package com.leyou.cart.controller;

import com.leyou.cart.entity.Cart;
import com.leyou.cart.service.CartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 分析有状态购物车数据如何存储
 * redis有五种数据结构
 * List Set --- java 修改List中的某个对象的属性 必须遍历，效率就很差
 * 这里应该选择hash结构的redis数据  <key, <hashKey, value>>
 *     这里：
 *     key就可以是当前用户id，用来标识当前购物车的从属者。
 *     hashKey就是具体某个购物车对象的id，也就是skuId，用来快速定位到某个购物车对象。
 *     value就是具体一个购物车对象
 *
 *  回顾：Spring的bean对象的作用域，默认所有对象都是单例，指定@Scope("prototype")可以将对象变成多例
 *      单例对象，在IOC容器初始化就全部创建成功，而且只创建一次，重复使用。
 *      多例对象，IOC容器初始化但是对象不会创建，是在使用的时候才创建。
 *  struts2 处理器都是多例的，多例就意味着每次访问都会创建一个新的对象，服务器压力大。
 */
@RestController
public class CartController {

    @Autowired
    private CartService cartService;

    /**
     * tomcat 是项目服务器
     * nginx 是静态资源服务器
     * tomcat 支持并发的， 默认150左右，优化好一点，可以支持200
     * 添加购物车
     */
    @PostMapping
    public ResponseEntity<Void> saveCart(@RequestBody Cart cart){
        cartService.saveCart(cart);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    /**
     * 获取购物车列表
     */
    @GetMapping("/list")
    public ResponseEntity<List<Cart>> findCarts(){
        List<Cart> carts = cartService.findCarts();
        return ResponseEntity.ok(carts);
    }

    /**
     * 合并购物车
     * @return
     */
    @PostMapping("/list")
    public ResponseEntity<List<Cart>> addLocalCartsToRedis(@RequestBody List<Cart> carts){
        cartService.addLocalCartsToRedis(carts);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

}
